/**
 * @file drv_pwm.h
 * @brief PWM驱动 - 简化版 (仅底层输出控制)
 * @date 2025-11-04
 */

#ifndef __DRV_PWM_H__
#define __DRV_PWM_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_hal.h"
#include <stdint.h>
#include <stdbool.h>

/* Exported types ------------------------------------------------------------*/

/**
 * @brief PWM通道枚举
 */
typedef enum {
    PWM_CH1 = 0,    /* PB1 - TIM3_CH4 */
    PWM_CH2,        /* PA7 - TIM3_CH2 */
    PWM_CH3,        /* PA6 - TIM3_CH1 */
    PWM_CH4,        /* PA5 - TIM3_CH1 */
    PWM_CH5,        /* PA4 - TIM3_CH2 */
    PWM_CH6,        /* PA3 - TIM2_CH4 */
    PWM_CH7,        /* PA2 - TIM2_CH3 */
    PWM_CH8,        /* PA1 - TIM2_CH2 */
    PWM_CH_MAX
} pwm_channel_e;

/* Exported constants --------------------------------------------------------*/

/* PWM配置 */
#define PWM_FREQ_HZ                 22000       /* 22kHz PWM频率 */

/* PWM 占空比精度模式 */
#define PWM_RESOLUTION              10000       /* 传统 0.01% 分辨率 (0-10000) */
#define PWM_DUTY_MIN                0           /* 0% */
#define PWM_DUTY_MAX                10000       /* 100.00% (传统模式) */

/* 高精度模式 (使用硬件全精度 0-2181) */
#define PWM_DUTY_MAX_HIGHRES        2181        /* 硬件最大精度 */

/* 板号特定PWM占空比 - 第一悬停 (时间3-1, 100ms) - 传统模式 (0-10000) */
#define PWM_FIRST_HOLD_DUTY_B1      3500        /* 35% 板1 (B11) */
#define PWM_FIRST_HOLD_DUTY_B2      3400        /* 34% 板2 (B10) */
#define PWM_FIRST_HOLD_DUTY_B3      3300        /* 33% 板3 (B9) */
#define PWM_FIRST_HOLD_DUTY_B4      3200        /* 32% 板4 (B8) */
#define PWM_FIRST_HOLD_DUTY_B5      3100        /* 31% 板5 (B7) */
#define PWM_FIRST_HOLD_DUTY_B6      3000        /* 30% 板6 (B6) */
#define PWM_FIRST_HOLD_DUTY_B7      2900        /* 29% 板7 (B5) */
#define PWM_FIRST_HOLD_DUTY_B8      2800        /* 28% 板8 (B4) */
#define PWM_FIRST_HOLD_DUTY_B9      2700        /* 27% 板9 (B3) */
#define PWM_FIRST_HOLD_DUTY_B10     2600        /* 26% 板10 (B2) */
#define PWM_FIRST_HOLD_DUTY_B11     2600        /* 26% 板11 (B1) */

/* 板号特定PWM占空比 - 第二悬停 (时间3-2, 直到关闭) - 传统模式 (0-10000) */
#define PWM_SECOND_HOLD_DUTY_B1_2   2500        /* 25% 板1-2 */
#define PWM_SECOND_HOLD_DUTY_B3_4   2400        /* 24% 板3-4 */
#define PWM_SECOND_HOLD_DUTY_B5_6   2300        /* 23% 板5-6 */
#define PWM_SECOND_HOLD_DUTY_B7_9   2200        /* 22% 板7-9 */
#define PWM_SECOND_HOLD_DUTY_B10_11 2100        /* 21% 板10-11 */

/* 高精度模式 (0-2181) - 第一悬停 */
#define PWM_FIRST_HOLD_DUTY_B1_HR      763        /* 35% 板1: 2181*0.35 */
#define PWM_FIRST_HOLD_DUTY_B2_HR      742        /* 34% 板2: 2181*0.34 */
#define PWM_FIRST_HOLD_DUTY_B3_HR      720        /* 33% 板3: 2181*0.33 */
#define PWM_FIRST_HOLD_DUTY_B4_HR      698        /* 32% 板4: 2181*0.32 */
#define PWM_FIRST_HOLD_DUTY_B5_HR      676        /* 31% 板5: 2181*0.31 */
#define PWM_FIRST_HOLD_DUTY_B6_HR      654        /* 30% 板6: 2181*0.30 */
#define PWM_FIRST_HOLD_DUTY_B7_HR      632        /* 29% 板7: 2181*0.29 */
#define PWM_FIRST_HOLD_DUTY_B8_HR      611        /* 28% 板8: 2181*0.28 */
#define PWM_FIRST_HOLD_DUTY_B9_HR      589        /* 27% 板9: 2181*0.27 */
#define PWM_FIRST_HOLD_DUTY_B10_HR     567        /* 26% 板10: 2181*0.26 */
#define PWM_FIRST_HOLD_DUTY_B11_HR     567        /* 26% 板11: 2181*0.26 */

/* 高精度模式 (0-2181) - 第二悬停 */
#define PWM_SECOND_HOLD_DUTY_B1_2_HR   545        /* 25% 板1-2: 2181*0.25 */
#define PWM_SECOND_HOLD_DUTY_B3_4_HR   523        /* 24% 板3-4: 2181*0.24 */
#define PWM_SECOND_HOLD_DUTY_B5_6_HR   502        /* 23% 板5-6: 2181*0.23 */
#define PWM_SECOND_HOLD_DUTY_B7_9_HR   480        /* 22% 板7-9: 2181*0.22 */
#define PWM_SECOND_HOLD_DUTY_B10_11_HR 458        /* 21% 板10-11: 2181*0.21 */

/* Exported functions prototypes ---------------------------------------------*/

/**
 * @brief 初始化PWM驱动
 * @return 0成功, -1失败
 * @note 必须在HAL定时器初始化之后调用
 */
int drv_pwm_init(void);

/**
 * @brief 启动PWM输出 (指定占空比)
 * @param ch PWM通道 (PWM_CH1-PWM_CH8)
 * @param duty 占空比 (0-10000, 对应0.00%-100.00%)
 * @return 0成功, -1失败
 */
int drv_pwm_start(pwm_channel_e ch, uint16_t duty);

/**
 * @brief 停止PWM输出
 * @param ch PWM通道 (PWM_CH1-PWM_CH8)
 * @return 0成功, -1失败
 */
int drv_pwm_stop(pwm_channel_e ch);

/**
 * @brief 设置PWM占空比 (通道必须已启动)
 * @param ch PWM通道 (PWM_CH1-PWM_CH8)
 * @param duty 占空比 (0-10000)
 * @return 0成功, -1失败
 */
int drv_pwm_set_duty(pwm_channel_e ch, uint16_t duty);

/**
 * @brief 获取板号对应的第一悬停占空比
 * @param board_id 板号 (1-11)
 * @return 占空比值 (0-10000), 无效板号返回0
 */
uint16_t drv_pwm_get_board_duty_1(uint8_t board_id);

/**
 * @brief 获取板号对应的第二悬停占空比
 * @param board_id 板号 (1-11)
 * @return 占空比值 (0-10000), 无效板号返回0
 */
uint16_t drv_pwm_get_board_duty_2(uint8_t board_id);

/**
 * @brief 停止所有PWM通道 (紧急停止)
 * @return 0成功, -1失败
 */
int drv_pwm_stop_all(void);

#ifdef __cplusplus
}
#endif

#endif /* __DRV_PWM_H__ */

/******************************** 文件结束 *********************************/
